package roleservicelogic

import (
	"context"
	"errors"

	"smile-sunshine-micorservice/rpc/User/db/crud"
	"smile-sunshine-micorservice/rpc/User/internal/svc"
	"smile-sunshine-micorservice/rpc/User/pb/zipTako.com/SmileSunshine/user"

	"github.com/zeromicro/go-zero/core/logx"
	"github.com/zeromicro/go-zero/core/stores/sqlc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

type GetRoleLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
	RolesModel crud.RolesModel // 添加 RolesModel 字段
}

func NewGetRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleLogic {
	return &GetRoleLogic{
		ctx:        ctx,
		svcCtx:     svcCtx,
		Logger:     logx.WithContext(ctx),
		RolesModel: crud.NewRolesModel(svcCtx.SqlConn, svcCtx.CacheConf), // 初始化 RolesModel
	}
}

func (l *GetRoleLogic) GetRole(in *user.GetRoleRequest) (*user.GetRoleResponse, error) {
	l.Logger.Infof("收到获取角色请求，角色ID：%d", in.Id)

	// 1. 参数验证 (如果需要，可以在这里添加对 in.Id 的验证)
	if in.Id <= 0 {
		return nil, status.Error(codes.InvalidArgument, "角色ID必须大于0")
	}

	// 2. 查询角色信息
	role, err := l.RolesModel.FindOne(l.ctx, in.Id)
	if err != nil {
		if errors.Is(err, sqlc.ErrNotFound) {
			l.Logger.Info("角色未找到，ID：%d", in.Id)
			return nil, status.Error(codes.NotFound, "角色未找到")
		}
		l.Logger.Errorf("查询角色失败：%v", err)
		return nil, status.Error(codes.Internal, "查询角色信息失败")
	}

	// 3. 检查角色是否已被删除 (如果 deleted_at 字段有意义)
	if role.DeletedAt.Valid {
		l.Logger.Info("尝试获取已删除的角色，ID：%d", in.Id)
		return nil, status.Error(codes.NotFound, "角色未找到") // 或者返回特定的已删除状态码
	}

	// 4. 返回成功响应
	return &user.GetRoleResponse{
		Role: &user.Role{
			Id:          role.Id,
			Name:        role.Name,
			Description: role.Description.String, // 注意处理 sql.NullString
			// CreatedAt 和 UpdatedAt 可以根据需要添加转换
		},
	}, nil
}
